package escalonador;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
 * Classe que contem constantes e metodos auxiliares.
 * 
 * @author Barbara Barbosa Silva
 * @author Daniel Tsuha
 * @author Felipe Sa de Mello
 * @author Lucas Machado
 */
public class Util {

	/**
	 * Enumeracao que guarda os valores possiveis de estado de um processo.
	 */
	public static enum statusProcesso {
		EXECUTANDO, PRONTO, BLOQUEADO, TERMINADO;
	}

	/*
	 * {@link String} nome do arquivo ZIP que contem arquivos de processos.
	public static final String ARQUIVO_PROCESSOS = "processos.zip";
	 */

	/**
	 * Metodo responsavel por carregar a lista de processos
	 * 
	 * @return {@link Queue} de {@link BCP} de processos
	 * @throws Exception
	 *             excecao geral, que sera lancada caso haja alguma excessao na
	 *             execucao
	 */
	public static Queue<BCP> carregaProcessos() throws Exception {

		Queue<BCP> processos = new LinkedList<BCP>();

		File[] arquivos = new File(System.getProperty("user.dir")).listFiles();
		
		for (File arquivo : arquivos){
			if (arquivo.isFile() && !arquivo.getName().contains(".")){
				
				FileReader input = new FileReader(arquivo);
				BufferedReader buffer = new BufferedReader(input);

				String nomeProcesso = buffer.readLine();

				ArrayList<String> comandos = new ArrayList<String>();
				String linha;
				while (isNotEmptyString(linha = buffer.readLine())) {
					comandos.add(linha);
				}
				
				BCP novoProcesso = new BCP(nomeProcesso, comandos);
				processos.add(novoProcesso);
				Logger.carregando(novoProcesso);
				
				buffer.close();
			}
		}
		
		/*
		//Carrega processos de um arquivo zip.
		//Vamos persistir o codigo comentado para o caso de precisar usar...
		ZipFile zFile = new ZipFile(zipFile);
		Enumeration<? extends ZipEntry> entries = zFile.entries();

		while (entries.hasMoreElements()) {
			ZipEntry zipEntry = entries.nextElement();
			if (!zipEntry.isDirectory()) {
				InputStream input = zFile.getInputStream(zipEntry);
				BufferedReader arquivo = new BufferedReader(new InputStreamReader(input,
						"UTF-8"));

				String nomeProcesso = arquivo.readLine();

				ArrayList<String> comandos = new ArrayList<String>();
				String linha;

				while (isNotEmptyString(linha = arquivo.readLine())) {
					comandos.add(linha);
				}
				BCP novoProcesso = new BCP(nomeProcesso, comandos);
				processos.add(novoProcesso);
				Logger.carregando(novoProcesso);

				arquivo.close();
			}
		}
		*/

		return processos;
	}

	/**
	 * Verifica se um dado texto nao eh <code>null</code> ou vazio
	 * 
	 * @param txt
	 *            A {@link String} do texto a ser verificado
	 * @return <code>false</code> se o texto for <code>null</code> ou vazio,
	 *         <code>true</code> caso contrario.
	 */
	public static boolean isNotEmptyString(String txt) {
		if (txt == null || txt.trim().equals("")) {
			return false;
		}
		return true;
	}
	
}
